/**
 * 暴露一些纯工具方法
 * catalogToTree： 根据文件夹目录生成树结构
 * configUniq： 配置数组去重
 * getFileConfigs: 获取当前目录在文件夹中的子路由配置
 */
import { getConfig } from './init'
import { MAIN_PATH } from '../config'

/**
 * 根据文件夹目录生成树
 * @param {Array} catalog 
 * @param {string} baseUrl 
 * @returns 
 */
export function catalogToTree(catalog, baseUrl = "") {
    const obj = {}, child = {}
    catalog.forEach(url => {
        const [cat, ...oth] = url.replace('./', '').split('/')
        const newUrl = url.replace('./' + cat, '')
        if (!obj[cat]) { obj[cat] = [] }
        if (!child[cat]) { child[cat] = [] }
        const isChildCat = oth.length > 1;
        if (isChildCat) {
            child[cat].push({ cat, newUrl, url })
        } else {
            obj[cat].push(url.replace('./', './' + (baseUrl ? baseUrl + '/' : '')))
        }
    });
    Object.entries(child).forEach(([key, val]) => {
        if (val.length) {
            const cobj = catalogToTree(val.map(c => '.' + c.newUrl), (baseUrl ? baseUrl + '/' : '') + key)
            obj[key].push(cobj)
        }
    })
    return obj
}


/**
 * 配置数组去重, 以name属性为标准
 * @param {array} configs 
 */
export function configUniq(configs) {
    const obj = {}
    return configs.filter(c => {
        const name = obj[c.name]
        if (!name) { obj[c.name] = true }
        return !name
    })
}


/**
 * 获取当前目录在文件夹中的子路由配置 
 * @param {object} tree 目录结构对象
 * @param {string} dirName 文件夹名称 
 * @returns 
 */
export function getFileConfigs(tree, dirName) {
    const result = [], // 包含文件夹目录的结构
        configArr = [], // 不包含文件夹目录的结构
        treeArr = tree[dirName];
    if (treeArr) {
        let dirArr = [], childArr = [];
        treeArr.forEach(u => {
            // 是否路径， 是否主路径
            if (typeof u === 'string') {
                const config = getConfig(u)
                const mainPath = u.includes(MAIN_PATH)
                result.push({ config: { ...config }, dir: u, mainPath })
                configArr.push(config)
            } else { // 处理其他目录结构
                Object.entries(u).forEach(([dirName]) => {
                    const { result, configs } = getFileConfigs(u, dirName)
                    dirArr = [...dirArr, ...result]
                    childArr = [...childArr, ...configs]
                })
            }
        })

        // 处理同级其他目录配置
        const mainIndex = result.findIndex(r => r.mainPath)
        if (mainIndex !== -1) {
            const rmain = result[mainIndex].config
            rmain.children = [...rmain.children, ...dirArr]
            const cmain = configArr[mainIndex]
            cmain.children = [...cmain.children, ...childArr]
        }
    }
    return { result, configs: configArr }
}
